#Boa:Dialog:Compras
 
import wx
import wx.lib.masked.textctrl
import wx.calendar
import wx.grid
import consultasBD
import Altaproductos
import Buscacolor2
import BuscaProdPorDescri
import consultasBD
import utiles
import sincronizar_tabla
import BuscaProveedor  
import Mensaje
import Pagos
from decimal import Decimal
import ChequesAlta
import time
import os
from decimal import Decimal

ROJO = (255, 145, 145, 255)
VERDE = (145, 255, 145, 255)
AZUL = (145, 145, 255, 255)
BLANCO = (255, 255, 255, 255)
AMARILLO = (254, 248, 191, 255)

def create(parent):
    return Compras(parent)

[wxID_COMPRAS, wxID_COMPRASBUTTON1, wxID_COMPRASBUTTON10, wxID_COMPRASBUTTON2, 
 wxID_COMPRASBUTTON3, wxID_COMPRASBUTTON4, wxID_COMPRASBUTTON5, 
 wxID_COMPRASBUTTON6, wxID_COMPRASBUTTON7, wxID_COMPRASBUTTON8, 
 wxID_COMPRASBUTTON9, wxID_COMPRASCOMBOBOX1, wxID_COMPRASGRID1, 
 wxID_COMPRASINCANTIDADES, wxID_COMPRASINDESC, wxID_COMPRASINFECHAFACTURA, 
 wxID_COMPRASINIVA, wxID_COMPRASINNOMBREPROVEE, wxID_COMPRASINPROVEEDOR, 
 wxID_COMPRASINSUBTOTAL, wxID_COMPRASINTOTAL, wxID_COMPRASNRO_FACTURA, 
 wxID_COMPRASPANEL1, wxID_COMPRASRADIOBUTTON1, wxID_COMPRASRADIOBUTTON2, 
 wxID_COMPRASSTATICBOX1, wxID_COMPRASSTATICTEXT1, wxID_COMPRASSTATICTEXT10, 
 wxID_COMPRASSTATICTEXT11, wxID_COMPRASSTATICTEXT12, wxID_COMPRASSTATICTEXT13, 
 wxID_COMPRASSTATICTEXT14, wxID_COMPRASSTATICTEXT15, wxID_COMPRASSTATICTEXT2, 
 wxID_COMPRASSTATICTEXT3, wxID_COMPRASSTATICTEXT4, wxID_COMPRASSTATICTEXT5, 
 wxID_COMPRASSTATICTEXT6, wxID_COMPRASSTATICTEXT7, wxID_COMPRASSTATICTEXT8, 
 wxID_COMPRASSTATICTEXT9, wxID_COMPRASTEXTCTRL1, wxID_COMPRASTEXTCTRL2, 
 wxID_COMPRASTEXTNOMBREPROVEE, wxID_COMPRASTOTALTOTAL, 
] = [wx.NewId() for _init_ctrls in range(45)]

class Compras(wx.Dialog):
    modificables = (0,3,4,5,6)
    
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_COMPRAS, name='', parent=prnt,
              pos=wx.Point(69, 17), size=wx.Size(855, 566),
              style=wx.DEFAULT_DIALOG_STYLE, title='Ingreso de Compras')
        self.SetClientSize(wx.Size(847, 539))

        self.inproveedor = wx.TextCtrl(id=wxID_COMPRASINPROVEEDOR,
              name='inproveedor', parent=self, pos=wx.Point(16, 24),
              size=wx.Size(72, 22), style=0, value='')

        self.inNombreProvee = wx.TextCtrl(id=wxID_COMPRASINNOMBREPROVEE,
              name='inNombreProvee', parent=self, pos=wx.Point(88, 24),
              size=wx.Size(184, 22), style=0, value='')
        self.inNombreProvee.SetEditable(True)

        self.button1 = wx.Button(id=wxID_COMPRASBUTTON1,
              label='Busca Proveedor', name='button1', parent=self,
              pos=wx.Point(280, 24), size=wx.Size(96, 22), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnBuscarProveedorButton,
              id=wxID_COMPRASBUTTON1)

        self.nro_factura = wx.TextCtrl(id=wxID_COMPRASNRO_FACTURA,
              name=u'nro_factura', parent=self, pos=wx.Point(392, 24),
              size=wx.Size(120, 21), style=wx.TE_RIGHT | wx.TE_LEFT, value=u'')

        self.staticText4 = wx.StaticText(id=wxID_COMPRASSTATICTEXT4,
              label='Total factura', name='staticText4', parent=self,
              pos=wx.Point(392, 48), size=wx.Size(62, 13), style=0)

        self.textCtrl2 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL2, name='textCtrl2',
              parent=self, pos=wx.Point(392, 64), size=wx.Size(120, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')

        self.infechafactura = wx.DatePickerCtrl(id=wxID_COMPRASINFECHAFACTURA,
              name='infechafactura', parent=self, pos=wx.Point(515, 24),
              size=wx.Size(85, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)

        self.textCtrl1 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL1, name='textCtrl1',
              parent=self, pos=wx.Point(600, 24), size=wx.Size(80, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.textCtrl1.SetEditable(False)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_COMPRASCOMBOBOX1,
              name='comboBox1', parent=self, pos=wx.Point(712, 24),
              size=wx.Size(130, 21), style=0, value='')
        self.comboBox1.SetLabel('')

        self.staticText11 = wx.StaticText(id=wxID_COMPRASSTATICTEXT11,
              label='Nro Factura', name='staticText11', parent=self,
              pos=wx.Point(392, 8), size=wx.Size(57, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_COMPRASSTATICTEXT2,
              label='Fecha Factura:', name='staticText2', parent=self,
              pos=wx.Point(515, 8), size=wx.Size(74, 13), style=0)

        self.staticText1 = wx.StaticText(id=wxID_COMPRASSTATICTEXT1,
              label='Fecha ingreso', name='staticText1', parent=self,
              pos=wx.Point(600, 8), size=wx.Size(67, 13), style=0)

        self.staticText14 = wx.StaticText(id=wxID_COMPRASSTATICTEXT14,
              label='Temporada', name='staticText14', parent=self,
              pos=wx.Point(712, 8), size=wx.Size(54, 13), style=0)

        self.button4 = wx.Button(id=wxID_COMPRASBUTTON4, label='Aceptar',
              name='button4', parent=self, pos=wx.Point(768, 56),
              size=wx.Size(72, 23), style=0)
        self.button4.Bind(wx.EVT_BUTTON, self.OnAceptar, id=wxID_COMPRASBUTTON4)

        self.button9 = wx.Button(id=wxID_COMPRASBUTTON9, label='Alta Proveedor',
              name='button9', parent=self, pos=wx.Point(280, 48),
              size=wx.Size(96, 22), style=0)
        self.button9.Bind(wx.EVT_BUTTON, self.OnAltaProveedor,
              id=wxID_COMPRASBUTTON9)

        self.grid1 = wx.grid.Grid(id=wxID_COMPRASGRID1, name='grid1',
              parent=self, pos=wx.Point(8, 96), size=wx.Size(832, 336),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
              self.OnGrid1GridCellChange)

        self.staticText5 = wx.StaticText(id=wxID_COMPRASSTATICTEXT5,
              label='Cant. Art.\nIngresados', name='staticText5', parent=self,
              pos=wx.Point(222, 458), size=wx.Size(54, 26), style=0)

        self.incantidades = wx.TextCtrl(id=wxID_COMPRASINCANTIDADES,
              name='incantidades', parent=self, pos=wx.Point(222, 488),
              size=wx.Size(48, 21), style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.incantidades.Enable(True)
        self.incantidades.SetEditable(False)

        self.staticText6 = wx.StaticText(id=wxID_COMPRASSTATICTEXT6,
              label='sin IVA', name='staticText6', parent=self,
              pos=wx.Point(304, 474), size=wx.Size(33, 13), style=0)

        self.insubtotal = wx.TextCtrl(id=wxID_COMPRASINSUBTOTAL,
              name='insubtotal', parent=self, pos=wx.Point(304, 488),
              size=wx.Size(64, 21), style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.insubtotal.Enable(True)
        self.insubtotal.SetEditable(False)

        self.staticText8 = wx.StaticText(id=wxID_COMPRASSTATICTEXT8,
              label='IVA', name='staticText8', parent=self, pos=wx.Point(367,
              474), size=wx.Size(17, 13), style=0)

        self.iniva = wx.TextCtrl(id=wxID_COMPRASINIVA, name='iniva',
              parent=self, pos=wx.Point(367, 488), size=wx.Size(62, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.iniva.SetEditable(False)

        self.staticText7 = wx.StaticText(id=wxID_COMPRASSTATICTEXT7,
              label='Sub-Total', name='staticText7', parent=self,
              pos=wx.Point(430, 474), size=wx.Size(46, 13), style=0)

        self.intotal = wx.TextCtrl(id=wxID_COMPRASINTOTAL, name='intotal',
              parent=self, pos=wx.Point(430, 488), size=wx.Size(66, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.intotal.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.intotal.SetEditable(False)

        self.button2 = wx.Button(id=wxID_COMPRASBUTTON2, label=u'Guardar',
              name='button2', parent=self, pos=wx.Point(728, 480),
              size=wx.Size(104, 28), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnButton2Button,
              id=wxID_COMPRASBUTTON2)

        self.textNombreProvee = wx.StaticText(id=wxID_COMPRASTEXTNOMBREPROVEE,
              label='', name='textNombreProvee', parent=self, pos=wx.Point(520,
              48), size=wx.Size(0, 13), style=0)

        self.staticText12 = wx.StaticText(id=wxID_COMPRASSTATICTEXT12,
              label='Desc. %', name='staticText12', parent=self,
              pos=wx.Point(534, 472), size=wx.Size(41, 13), style=0)

        self.indesc = wx.TextCtrl(id=wxID_COMPRASINDESC, name='indesc',
              parent=self, pos=wx.Point(534, 488), size=wx.Size(63, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.indesc.Bind(wx.EVT_TEXT_ENTER, self.OnDescuentoEnter,
              id=wxID_COMPRASINDESC)
        self.indesc.Bind(wx.EVT_KILL_FOCUS, self.OnDescuentoPerderFoco)

        self.staticText13 = wx.StaticText(id=wxID_COMPRASSTATICTEXT13,
              label='Total', name='staticText13', parent=self, pos=wx.Point(598,
              472), size=wx.Size(24, 13), style=0)

        self.totaltotal = wx.TextCtrl(id=wxID_COMPRASTOTALTOTAL,
              name='totaltotal', parent=self, pos=wx.Point(598, 488),
              size=wx.Size(82, 21), style=wx.TE_RIGHT | wx.TE_LEFT,
              value='0.0')
        self.totaltotal.SetEditable(False)

        self.button3 = wx.Button(id=wxID_COMPRASBUTTON3,
              label=u'Imprimir Etiquetas', name='button3', parent=self,
              pos=wx.Point(728, 440), size=wx.Size(104, 28), style=0)
        self.button3.Enable(True)
        self.button3.Bind(wx.EVT_BUTTON, self.OnImprimirButton,
              id=wxID_COMPRASBUTTON3)

        self.button5 = wx.Button(id=wxID_COMPRASBUTTON5, label='Talle',
              name='button5', parent=self, pos=wx.Point(304, 440),
              size=wx.Size(64, 23), style=0)
        self.button5.Bind(wx.EVT_BUTTON, self.OnTalle, id=wxID_COMPRASBUTTON5)

        self.button6 = wx.Button(id=wxID_COMPRASBUTTON6, label='Color',
              name='button6', parent=self, pos=wx.Point(368, 440),
              size=wx.Size(64, 23), style=0)
        self.button6.Bind(wx.EVT_BUTTON, self.OnColor, id=wxID_COMPRASBUTTON6)

        self.button7 = wx.Button(id=wxID_COMPRASBUTTON7,
              label='Articulo Sussan', name='button7', parent=self,
              pos=wx.Point(456, 440), size=wx.Size(88, 23), style=0)
        self.button7.Bind(wx.EVT_BUTTON, self.OnBuscarArticuloSussan,
              id=wxID_COMPRASBUTTON7)

        self.button8 = wx.Button(id=wxID_COMPRASBUTTON8, label='Art. Proveedor',
              name='button8', parent=self, pos=wx.Point(544, 440),
              size=wx.Size(88, 23), style=0)
        self.button8.Bind(wx.EVT_BUTTON, self.OnBuscarArticuloProveedor,
              id=wxID_COMPRASBUTTON8)

        self.button10 = wx.Button(id=wxID_COMPRASBUTTON10, label='Ajustar',
              name='button10', parent=self, pos=wx.Point(648, 440),
              size=wx.Size(64, 23), style=0)
        self.button10.Bind(wx.EVT_BUTTON, self.OnAjustar,
              id=wxID_COMPRASBUTTON10)

        self.panel1 = wx.Panel(id=wxID_COMPRASPANEL1, name='panel1',
              parent=self, pos=wx.Point(8, 440), size=wx.Size(144, 72),
              style=wx.TAB_TRAVERSAL)

        self.radioButton1 = wx.RadioButton(id=wxID_COMPRASRADIOBUTTON1,
              label='Actualiza Servidor', name='radioButton1',
              parent=self.panel1, pos=wx.Point(8, 16), size=wx.Size(120, 13),
              style=0)
        self.radioButton1.SetValue(True)
        self.radioButton1.Bind(wx.EVT_RADIOBUTTON, self.OnRadio1,
              id=wxID_COMPRASRADIOBUTTON1)

        self.radioButton2 = wx.RadioButton(id=wxID_COMPRASRADIOBUTTON2,
              label='NO actualiza Servidor', name='radioButton2',
              parent=self.panel1, pos=wx.Point(8, 40), size=wx.Size(128, 13),
              style=0)
        self.radioButton2.SetValue(True)
        self.radioButton2.Bind(wx.EVT_RADIOBUTTON, self.OnRadio2,
              id=wxID_COMPRASRADIOBUTTON2)

        self.staticBox1 = wx.StaticBox(id=wxID_COMPRASSTATICBOX1,
              label='Nro.Proveedor Nombre Proveedor', name='staticBox1',
              parent=self, pos=wx.Point(8, 6), size=wx.Size(376, 80), style=0)

        self.staticText3 = wx.StaticText(id=wxID_COMPRASSTATICTEXT3,
              label='? - Buscar cod. art. proveedor', name='staticText3',
              parent=self, pos=wx.Point(16, 520), size=wx.Size(145, 13),
              style=0)

        self.staticText9 = wx.StaticText(id=wxID_COMPRASSTATICTEXT9,
              label='t - buscar Talle', name='staticText9', parent=self,
              pos=wx.Point(200, 520), size=wx.Size(71, 13), style=0)

        self.staticText10 = wx.StaticText(id=wxID_COMPRASSTATICTEXT10,
              label='c - buscar Color', name='staticText10', parent=self,
              pos=wx.Point(304, 520), size=wx.Size(75, 13), style=0)

        self.staticText15 = wx.StaticText(id=wxID_COMPRASSTATICTEXT15,
              label='* puesto en cod. art. proveedor => Devolucion',
              name='staticText15', parent=self, pos=wx.Point(432, 520),
              size=wx.Size(229, 13), style=0)

    def __init__(self, parent):        
        self._init_ctrls(parent)
        self.sucursal = utiles.getSucursalActiva()
        self.grillafactura()
        self.textCtrl1.SetLabel(utiles.obtenerFecha("d/m/Y"))
        self.radioButton1.SetValue(False)
        self.radioButton2.SetValue(False)
        self.llenarCombo()
        self.verificarInterrupcion()

    def llenarCombo(self):
        anio = int(utiles.obtenerFecha("Y-m-d")[:4])
        mes = int(utiles.obtenerFecha("Y-m-d")[5:7])
        dia = int(utiles.obtenerFecha("Y-m-d")[-2:])
        anioanterior = anio -1
        anioactual = anio
        aniosiguiente = anio + 1
        self.comboBox1.Append("INVIERNO"+str(anioanterior))
        self.comboBox1.Append("VERANO"+str(anioanterior))
        self.comboBox1.Append("INVIERNO"+str(anioactual))
        self.comboBox1.Append("VERANO"+str(anioactual))
        self.comboBox1.Append("INVIERNO"+str(aniosiguiente))
        self.comboBox1.Append("VERANO"+str(aniosiguiente))
##        if mes < 8: #invierno
##            self.comboBox1.SetSelection(2)
##        else: #verano
##            self.comboBox1.SetSelection(3)
        
    def verificaEncabezado(self):
        self.idproveedor = self.inproveedor.GetLabel()
        self.nrofactura = self.nro_factura.GetLabel()
        aux = self.infechafactura.GetLabel()
        self.fechafactura = aux[-4:]+"-"+aux[3:5]+"-"+aux[:2]+" 00:00:00"
        self.fechaingreso = utiles.obtenerFecha("Y-m-d h:m:s")
        aux1 = self.infechafactura.GetLabel()
        fechafactura = aux[-4:]+aux[3:5]+aux[:2]
        aux2 = utiles.obtenerFecha("Y-m-d")
        fechaingreso = aux2.replace("-","")
        self.temporada = self.comboBox1.GetLabel()
        self.valorfactura = self.textCtrl2.GetLabel()

        if self.valorfactura == "":
            texto = "Debe informar el importe"
            texto+= "del ticket o factura"
            utiles.mensaje(None,texto)
            self.textCtrl2.SetFocus()
            return False
        if fechafactura>fechaingreso:
            texto = "Fecha de la factura no puede\n"
            texto+= "ser posterior a la fecha actual."
            utiles.mensaje(None,texto)
            self.infechafactura.SetFocus()
            return False
        if self.idproveedor=="":
            utiles.mensaje(None,"Debe ingresar codigo de proveedor")
            self.inproveedor.SetFocus()
            return False
        if self.nrofactura=="":
            utiles.mensaje(None,"Debe ingresar Nro. de Factura")
            self.nro_factura.SetFocus()
            return False
        if self.temporada=="":
            utiles.mensaje(None,"Debe seleccionar una temporada")
            self.comboBox1.SetFocus()
            return False
        r1 = "SELECT idproveedor FROM proveedor "
        r2 = "WHERE idproveedor='"+self.idproveedor+"'"
        consultaSQL = r1+r2
        resultado = consultasBD.ordenCruda(consultaSQL)
        if resultado == () or resultado == None:
            utiles.mensaje(None,"Codigo de proveedor inexistente")
            self.inproveedor.SetLabel("")
            self.inNombreProvee.SetLabel("")
            self.inproveedor.SetFocus()
            return False
        r1 = "SELECT nrofactura FROM compras "
        r2 = "WHERE idproveedor='"+self.idproveedor+"' AND nrofactura='"+self.nrofactura+"'"
        consultaSQL = r1+r2
        resultado = consultasBD.ordenCruda(consultaSQL)
        if resultado != None:
            if len(resultado)>0:
                utiles.mensaje(None,"Ya existe esa factura para el proveedor ingresado")
                self.nro_factura.SetFocus()
                return False
        else:
            utiles.mensaje(None,"Error en la lectura ID provedor/Nro Factura")
            self.inproveedor.SetFocus()
            return False
        return True

    def limpiar(self):
        self.inproveedor.SetLabel("")
        self.inNombreProvee.SetLabel("")
        self.nro_factura.SetLabel("")
        self.grid1.ClearGrid()
        self.actualizaSubtotal()
        self.autosizegrilla()
        self.comboBox1.SetLabel("")
        self.textCtrl2.SetLabel("")
        self.grid1.Refresh()
        try:
            os.remove("Compras.txt")
        except:
            print "Archivo temporal inexistente"
            
    def habilitaEncabezado(self,habilita=True):
        self.inproveedor.Enable(habilita)
        self.inNombreProvee.Enable(habilita)
        self.button1.Enable(habilita)
        self.button9.Enable(habilita)
        self.nro_factura.Enable(habilita)
        self.infechafactura.Enable(habilita)
        self.textCtrl1.Enable(habilita)
        self.textCtrl2.Enable(habilita)
        self.comboBox1.Enable(habilita)
        self.grid1.EnableEditing(not habilita)
        self.button2.Enable(not habilita)
        self.button3.Enable(not habilita)
        self.button5.Enable(not habilita)
        self.button6.Enable(not habilita)
        self.button7.Enable(not habilita)
        self.button8.Enable(not habilita)
        self.radioButton1.Enable(not habilita)
        self.radioButton2.Enable(not habilita)
        
        self.indesc.Enable(not habilita)
        if habilita:
            self.button4.SetLabel("Aceptar")
            self.inproveedor.SetFocus()
        else:
            self.button4.SetLabel("Limpiar")
            self.grid1.SetFocus()

    def OnBuscarArticuloSussan(self, event):
        import BuscarArticuloPorProveedor
        dlg = BuscarArticuloPorProveedor.Dialog1(self,self.inproveedor.GetLabel())
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy()        

    def OnBuscarArticuloProveedor(self, event):
        if self.inproveedor.GetLabel() == "":
            self.inproveedor.SetFocus()
            return
        dlg = BuscaProdPorDescri.BuscarDescrip(self, self.inproveedor.GetLabel())
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy()

    def OnAltaProveedor(self, event):
        import AltaProveedores
        dlg = AltaProveedores.Dialog1(self)
        try:
            dlg.ShowModal()
            micodigo = dlg.codigoProveedor
        finally:
            dlg.Destroy()
        if micodigo<>"":
            self.inproveedor.SetLabel(micodigo)
            self.OnBuscarProveedorButton(None)
            self.nro_factura.SetFocus()

    def OnAjustar(self, event):
        self.autosizegrilla()
        self.grid1.SetFocus()

    def OnTalle(self, event):
        import ConsultasVarias
        consultaSQL = "SELECT DISTINCT talle,' ' FROM producto_talle_color WHERE 1 ORDER BY talle"
        ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
        try:
            ventana.ShowModal()
        finally:
            ventana.Destroy()

    def OnColor(self, event):
        import ConsultasVarias
        consultaSQL = "SELECT nombre,idcolor FROM colores WHERE 1 ORDER BY nombre"
        ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
        try:
            ventana.ShowModal()
        finally:
            ventana.Destroy()

    def OnAceptar(self, event, pregunta=True):
        if self.button4.GetLabel() == "Limpiar":
            if pregunta:
                import Dialog2
                texto = "ATENCION: \n\n"
                texto+= "Se perderan los datos cargados en pantalla.\n"
                texto+= "Desea proceder?\n\n\n"
                texto+= "ACEPTAR = si                    CANCELAR = no"
                confirma = Dialog2.Dialog2(self, texto)
                try:
                    confirma.ShowModal()
                    if not confirma.getSeleccion():
                        return
                finally:
                    pass
            self.habilitaEncabezado(True)
            self.limpiar()
            return
        if not self.verificaEncabezado():
            return
        self.habilitaEncabezado(False)

    def autosizegrilla(self):
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,None)
        for i in xrange(self.grid1.GetNumberCols()):
            self.grid1.AutoSizeColumn(i,True)
        self.grid1.Refresh()
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,self.OnGrid1GridCellChange)
        
    def grillafactura(self):
        #CodArtProveedor,CodSussan,Descripcion,Cant,Talle,Color,$ Costo,Iva,Total,PVenta
        #0               1         2           3    4     5     6       7   8     9
        columnas =['Codigo Articulo\nProveedor','Codigo\nSussan','Descripcion','Cantidad','Talle','Color','$ Costo','Iva','Total','Precio\nVenta']
        self.grid1.CreateGrid(100,len(columnas))
        
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)
        self.autosizegrilla()

        self.grid1.EnableEditing(False)
            
        self.total = "" 
        self.grid1.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        
        #para hacer que solo sean legibles algunas columnas
##        for x in xrange(11):
##            for i in xrange(10):
##                if i not in self.modificables:
##                    self.grid1.SetReadOnly(x,i,True)
        #fin configuracion grilla facturacion
    
    def _buscar(self, codartprov):
        '''Dada un codigo de producto intenta encontrarlo en la bd y devolverlo'''
        proveedor = self.inproveedor.Value
        #sql = "SELECT * FROM productos p JOIN producto_codartprov cb on(p.codsussan = cb.codsussan) WHERE p.proveedor = '%s' AND cb.codartprov LIKE '%s'" % (proveedor, codartprov)
        r1 = "SELECT * FROM productos p "
        r2 = "JOIN producto_codartprov cb ON (p.codsussan = cb.codsussan) "
        r3 = "WHERE p.proveedor = '%s' AND cb.codartprov LIKE '%s'" % (proveedor, codartprov)
        sql = r1+r2+r3
        resultados = consultasBD.ordenCrudaDict(sql)
        return resultados
            
    def _buscar_interactivo(self):
        '''Abre el dialogo de busqueda de productos'''
        proveedor = self.inproveedor.Value
        dlg = BuscaProdPorDescri.BuscarDescrip(self, proveedor)
        try:
            dlg.ShowModal()
            codsussan = dlg.Muestraid()
        finally:
            dlg.Destroy()        
        return codsussan
    
    def _asociar_codsussan_codbarra(self, codartprov, codsussan):
        '''Agrega una fila en la BD asociando el codsussan con un codigo de barra del proveedor'''
        #sql = "INSERT INTO producto_codartprov (codartprov, codsussan) VALUES ('%s', '%s')" % (codartprov, codsussan)
        r1 = "INSERT INTO producto_codartprov (codartprov, codsussan)"
        r2 = "VALUES ('%s', '%s')" % (codartprov, codsussan)
        sql = r1+r2
        consultasBD.executa(None, sql)
    
    def _alta_interactivo(self, codartprov=""):
        '''Se abre el dialogo para dar de alta un producto'''
        #lo llamo con el proveedor y el cod del articulo nuevo
        cod_prov = str(self.inproveedor.Value)
        temporada = self.comboBox1.GetLabel()
        dlg = Altaproductos.Altaproductos(self,cod_prov,codartprov,1,temporada) #el 1 significa que es un alta por COMPRAS y ya precarga los valores en los campos del form.
        try:
            dlg.ShowModal() #inserta el art. y luego trae el resultado a la grilla
            return dlg.get_codsussan()
        finally:
            dlg.Destroy()

    def _mostrar_articulo_en_grilla(self, fila, articulo):
        '''Muestra un articulo en la fila dada'''
        fil = self.grid1.GetGridCursorRow()
        #fil = fila
        if "*" in self.grid1.GetCellValue(fil,0):
            return
        #CodArtProveedor,CodSussan,Descripcion,Cant,Talle,Color,$ Costo,Iva,Total,PVenta
        #0               1         2           3    4     5     6       7   8     9
        self.grid1.SetCellValue(fil, 0, articulo['codartprov']) #cod. prov
        self.grid1.SetCellValue(fil, 1, articulo['codsussan']) #cod. sussan
        self.grid1.SetReadOnly(fil, 1, True)
        self.grid1.SetCellValue(fil, 2, articulo['descri']) #descri
        self.grid1.SetReadOnly(fil, 2, True)
        self.grid1.SetCellValue(fil, 3, "1") #cant.
        self.grid1.SetCellAlignment(fil, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellValue(fil, 4, "") #talle
        self.grid1.SetCellValue(fil, 5, "") #color
        self.grid1.SetCellValue(fil, 6, str(articulo['preciolt2'])) #p compra
        #self.grid1.SetReadOnly(fil, 6, True)
        self.grid1.SetCellAlignment(fil, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellValue(fil, 8, str(articulo['preciolt2'])) #final
        self.grid1.SetReadOnly(fil, 8, True)
        self.grid1.SetCellAlignment(fil, 8, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellValue(fil, 9, str(articulo['preciolt1'])) #precio venta
        self.grid1.SetReadOnly(fil, 9, True)
        self.grid1.SetCellAlignment(fil, 9, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)

    def OnGrid1GridCellChange(self, event):
        '''Manejador de los cambios en la grilla'''
        fila = self.grid1.GetGridCursorRow()
        columna = self.grid1.GetGridCursorCol()
        celda = self.grid1.GetCellValue(fila, columna)

        #CELDA VACIA
        if celda == "" :
            self.grid1.SetCellValue(fila, columna, "")
            for x in xrange(self.grid1.GetNumberCols()):
                self.grid1.SetCellValue(fila, x, "")

            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila,True)
            return
        
        #INGRESO ALGO
        # BUSCAR
        if ( columna == 0 and celda.startswith("?") ):
            codsussan, codartprov = self._buscar_interactivo()
            if not codsussan:
                codsussan = self._alta_interactivo()
                resultados = self._buscar(codsussan)
            else:
                resultados = self._buscar(codartprov)
            try:
                articulo = resultados[0]
            except:
                utiles.mensaje(None,"Producto no ingresado")
                self.grid1.SetFocus()
            self._mostrar_articulo_en_grilla(fila, articulo)

            #actualizo subtotal
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)

        # INGRESO UN CODIGO
        elif (columna == 0):
            codartprov = self.grid1.GetCellValue(fila, columna)
            if "*" in codartprov:
                #devolucion
                return
            resultados = self._buscar(codartprov)
            # NO LO ENCONTRO.
            if len(resultados) == 0:
                codsussan, codartprov_old = self._buscar_interactivo()
                if codsussan:
                    self._asociar_codsussan_codbarra(codartprov, codsussan)
                else:
                    #NO LO ENCONTRO. DAR DE ALTA. OK
                    self._alta_interactivo(codartprov)
                    
            resultados = self._buscar(codartprov)
            try:
                articulo = resultados[0]
            except:
                return
            self._mostrar_articulo_en_grilla(fila, articulo)
            
            #actualizo subtotal
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)
            
        #INGRESO UNA CANTIDAD
        elif (columna == 3):
            #validar que sea un nro. en la cantidad
            self._validar_cantidad(fila)
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)

        #INGRESO UN TALLE
        elif (columna == 4):
            codtalle = self.grid1.GetCellValue(self.grid1.GetGridCursorRow(),4)
            if (codtalle[:1] == "t"):
                import ConsultasVarias
                consultaSQL = "SELECT DISTINCT talle,' ' FROM producto_talle_color WHERE 1 ORDER BY talle"
                ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
                try:
                    ventana.ShowModal()
                    id = ventana.Muestraid()
                    self.grid1.SetCellValue(fila, columna, str(id))
                finally:
                    ventana.Destroy()
                #self.autosizegrilla()
                self.actualizaSubtotal()
                self.grid1.Refresh()
                self.almacenamientoTemporal(fila)
                return
            self.actualizaSubtotal()
            self.almacenamientoTemporal(fila)
            
        #INGRESO UN COLOR
        elif (columna == 5):
            #carga el color
            codcolor = self.grid1.GetCellValue(self.grid1.GetGridCursorRow(),5)
            if (codcolor[:1] == "c"):
                import ConsultasVarias
                consultaSQL = "SELECT nombre,idcolor FROM colores WHERE 1 ORDER BY nombre"
                ventana = ConsultasVarias.ConsultasVarias(self,consultaSQL)
                try:
                    ventana.ShowModal()
                    id = ventana.Muestraid()
                    aux1 = id.split(" / ")[0]
                    aux2 = id.split(" / ")[1]
                    self.grid1.SetCellValue(fila, columna, str(aux2))
                finally:
                    ventana.Destroy()

                #self.autosizegrilla()
                self.actualizaSubtotal()
                self.grid1.Refresh()
                self.almacenamientoTemporal(fila)
                return
            self.actualizaSubtotal()
            self.almacenamientoTemporal(fila)
    
        #INGRESO UN PRECIO
        elif (columna == 6):
            #validar que sea un nro. en la cantidad
            if not self._validar_precio(fila):
                self.grid1.SetCellValue(fila, 6, "1.00")            
                self.grid1.SetCellAlignment(fila, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
                
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)
    
    def _validar_precio(self, fila):
        '''Verifica que el precio este correcto'''        
        precio = self.grid1.GetCellValue(fila, 6)
        if not utiles.isDecimal(precio):
            msg   = "El precio debe ser un numero"                         
            utiles.mensaje(self, msg)
            return False
        return True
            
    def _validar_cantidad(self, fila):
        '''Verifica que la cantidad en una fila sea adecuada'''
        error = False
        msg   = ""
        cantidad = self.grid1.GetCellValue(fila, 3)
        try:
            if int(cantidad) == 0:
                error = True
                msg = "La cantidad no puede ser CERO"
                self.grid1.SetCellValue(fila, 3, "1")
                self.grid1.SetCellAlignment(fila, 3 ,wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
                
        except:
            error = True
            msg   = "La cantidad debe ser un numero entero"             
            self.grid1.SetCellValue(fila, 3, "1")
            self.grid1.SetCellAlignment(fila, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)

        if error:
            mensaje = wx.MessageDialog(self, msg, "Error", style=wx.OK,pos = wx.DefaultPosition)
            mensaje.ShowModal()
            return False
        
        return True     
            
    def actualizaSubtotal(self):        
        #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
        #0            1          2      3    4     5     6       7   8     9
        cantidades = 0
        tomocelda  = 0.0
        # validar solo cuando se ingresa un nro y no una letra
        for x in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(int(x),0) != ""):
                cantidad = int(self.grid1.GetCellValue(int(x),3))
                cantidades += cantidad
                try:
                    precio = Decimal(self.grid1.GetCellValue(x, 6)).quantize(Decimal("0.10"))
                except:
                    precio = Decimal("0.00")
                iva = Decimal("0.00")
                if self.radioButton1.GetValue():
                    try:
                        iva = (precio*Decimal("0.21")).quantize(Decimal("0.10"))
                    except:
                        iva = Decimal("0.00")
                try:
                    total = Decimal(str(cantidad*(precio+iva))).quantize(Decimal("0.10"))
                except:
                    total = Decimal("0.00")
                self.grid1.SetCellValue(x, 7, str(iva))
                self.grid1.SetCellAlignment(x, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
                self.grid1.SetCellValue(x, 8, str(total))
                self.grid1.SetCellAlignment(x, 8, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
                self.grid1.Refresh() # va un refresh asi el proximo metodo ya toma los cambios
            else:
                pass

        self.incantidades.ChangeValue(str(cantidades))  
        self.subtotalfactura()

    def subtotalfactura(self):
        '''Calcula y muestra en pantalla el subtotal de la factura'''
        #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
        #0            1          2      3    4     5     6       7   8     9
        subtotal = Decimal("0.00")
        for fila in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fila,0)=="":
                continue
            try:
                monto = Decimal(self.grid1.GetCellValue(fila,8)).quantize(Decimal("0.10"))
            except:
                monto = Decimal("0.00")
            subtotal = (subtotal+monto).quantize(Decimal("0.10"))
        if self.radioButton1.GetValue():
            siniva = (subtotal/Decimal("1.21")).quantize(Decimal("0.10"))
            iva = (siniva*Decimal("0.21")).quantize(Decimal("0.10"))
        else:
            siniva = subtotal
            iva = Decimal("0.00")
        
        self.insubtotal.SetLabel(str(siniva))
        self.iniva.SetLabel(str(iva))
        self.intotal.SetLabel(str(subtotal))

        self.OnDescuentoPerderFoco(None)
        self.grid1.Refresh()

    def _cantidad_de_prendas(self):
        '''Retorna la cantidad de prendas en la grilla'''
        return self.incantidades.Value
            
    def _crear_factura(self):
        '''Crea una factura de compra en la BD'''
        idfactura = utiles.secuencia("compras", self.sucursal)
        nrofactura = self.nro_factura.Value
        idproveedor = self.inproveedor.Value
        fechafactura = utiles.formatear_fecha_date(self.infechafactura.Value)
        fechaingreso = utiles.obtenerFecha("Y-m-d h:m:s")
        cantprendas = self._cantidad_de_prendas()
        if self.radioButton1.GetValue():
            en1oen2 = 1
        else:
            en1oen2 = 2
        subtotal = self.insubtotal.Value   
        iva = self.iniva.Value
        total = self.intotal.Value
        totaltotal = self.totaltotal.Value
        
        r1 = "INSERT INTO compras ("
        r2 = "idfactura, nrofactura, idproveedor, "
        r3 = "fechafactura, fechaingreso, cantprendas, "
        r4 = "en1oen2, subtotal, iva, total) "
        r5 = "VALUES ("
        r6 = "'%s', '%s', '%s'," % (idfactura, nrofactura, idproveedor)
        r7 = "'%s', '%s', '%s'," % (fechafactura, fechaingreso, cantprendas)
        r8 = "'%s', '%s', '%s', '%s') " % (en1oen2, subtotal, iva, totaltotal)
        sql = r1+r2+r3+r4+r5+r6+r7+r8
        consultasBD.executaSinCommit(None, sql)
        return idfactura

    def _agregar_stock(self, idfactura):
        '''Incrementa el stock de los productos adquiridos'''
        for x in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(int(x),0) == ""):
                continue
            #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
            #0            1          2      3    4     5     6       7   8     9                
            codsussan    = self.grid1.GetCellValue(int(x),1)
            cantidad = int(self.grid1.GetCellValue(int(x),3))
            talle    = self.grid1.GetCellValue(int(x),4).upper()
            color    = self.grid1.GetCellValue(int(x),5)
            sucursal = self.sucursal
            
            #Si no existe el PTC se crea  
            ptc = self._buscar_producto_talle_color(codsussan, talle, color)
            self._crear_stock_si_no_esta(ptc, sucursal)
            stock = utiles.stock_sumado(ptc, sucursal, cantidad)
            utiles.agregar_movimiento(ptc, stock_previo=stock - cantidad, stock_nuevo=stock, operacion='compra', idcompra = idfactura, sucursal=self.sucursal)
            
            #sql = "UPDATE stock SET stock = '%s' WHERE ptc = '%s' AND sucursal = '%s'" % (stock, ptc, sucursal)                
            r1 = "UPDATE stock SET stock = '%s' " % (stock)
            r2 = "WHERE ptc = '%s' AND sucursal = '%s' " % (ptc, sucursal)
            sql = r1+r2
            sincronizar_tabla.addChange(sql=sql)
            consultasBD.executaSinCommit(None, sql)
        
    def _agregar_items(self, idfactura):
        '''Agrega items a la factura creada'''
        for x in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(int(x),0) == ""):
                continue
            #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
            #0            1          2      3    4     5     6       7   8     9                
            codsussan = self.grid1.GetCellValue(int(x),1)
            cantidad = int(self.grid1.GetCellValue(int(x),3))
            talle = self.grid1.GetCellValue(int(x),4)
            color = self.grid1.GetCellValue(int(x),5)
            costounidad = str(Decimal(self.grid1.GetCellValue(x,6)).quantize(Decimal("0.10")))

            r1 = "INSERT INTO compras_items (idfactura, codsussan, color, talle, cantidad, costounidad) "
            r2 = "VALUES ("
            r3 = "'%s', '%s', '%s'," % (idfactura, codsussan, color)
            r4 = "'%s', '%s', '%s')" % (talle, cantidad, costounidad)
            sql = r1+r2+r3+r4
            consultasBD.executaSinCommit(None, sql)

    def _validar_guardar(self):
        '''Validaciones varias antes de guardar una factura'''
        error = False
        msg = ""

        valorfacturacargado = Decimal(self.textCtrl2.GetLabel()).quantize(Decimal("0.10"))
        valorfacturacalcula = Decimal(self.totaltotal.GetLabel()).quantize(Decimal("0.10"))
        
        if valorfacturacargado<>valorfacturacalcula:
                error = True
                msg += "Total factura cargado no coincide con calculado\n"
                self.textCtrl2.Enable(True)
                self.textCtrl2.SetFocus()

        if self.inNombreProvee.Value == "":
            error = True
            msg += "Ingrese un Proveedor\n"
            
        if self.nro_factura.Value == "":    
            error = True
            msg += "Ingrese el Numero de Factura\n"
                
        if self.incantidades.Value in ("", "0"):
            error = True
            msg += "Debe ingresar por lo menos un Articulo"
                
        if not self._color_talle_completo():
            error = True
            msg += "Debe completar un Talle y un Color"                

        if self.radioButton1.GetValue()==False and self.radioButton2.GetValue()==False:
            error = True
            msg += "Debe indicar si Actualiza o No el servidor\n(tipo 1 o 2)"
                
        if error:
            mensaje = wx.MessageDialog(self, msg, "Error", style=wx.OK,pos = wx.DefaultPosition)
            mensaje.ShowModal()
            return  False
            
        return True 
    
    def _color_talle_completo(self):  
        '''Verifica que todas las filas tengan asignados tanto color como talle'''       
        #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
        #0            1          2      3    4     5     6       7   8     9          
        for x in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(int(x),0) != ""):
                talle    = self.grid1.GetCellValue(int(x),4)
                color    = self.grid1.GetCellValue(int(x),5)
                
                if talle == "" or color == "":
                    return False
                    break
        return True
    
    def _validar_imprimir(self):
        '''Validaciones varias antes de imprimir las etiquetas'''
        error = False
        msg = ""
        if self.incantidades.Value in ("", "0"):
            error = True
            msg += "Debe ingresar por lo menos un Articulo"
                
        if not self._color_talle_completo():
            error = True
            msg += "Debe completar un Talle y un Color"
                                
        if error:
            mensaje = wx.MessageDialog(self, msg, "Error", style=wx.OK,pos = wx.DefaultPosition)
            mensaje.ShowModal()
            return  False                
        return True

    def OnButton2Button(self, event):
        self.autosizegrilla()
        if not self._validar_guardar():
            print "No validado el guardado, faltan datos"
            return
        try:
            self.button2.Enable(False)
            self.button2.SetLabel('PROCESANDO')
            
            consultasBD.begin()
            idfactura = self._crear_factura()
            self._agregar_stock(idfactura)
            self._agregar_items(idfactura)

            # lo nuevo del 2010 !!!!
            self.guardaencomprasoperaciones(idfactura)
            #nuevo

            consultasBD.commit()
            sincronizar_tabla.syncServerTables(self, ["productos", "producto_talle_color", "stock"])
            raise sincronizar_tabla.SyncError
            utiles.mensaje(self, "La compra se guardo y sincronizo correctamente")            
            self.OnAceptar(None,False)
 
        except sincronizar_tabla.SyncError:
            texto = "La compra se guardo pero fallo la sincronizacion.\n"
            texto+= "Por favor, realice una sincronizacion manual.\n"
            utiles.mensaje(self, texto)
            self.OnAceptar(None,False)
        except Exception, e:
            import traceback
            import sys
            exc_type, exc_value, exc_tb = sys.exc_info()
            traceback.print_exception(exc_type, exc_value, exc_tb)
            print e.__str__()
            utiles.mensaje(self, "NO se pudo guardar la compra")    
            consultasBD.rollback()

            self.button2.SetLabel('GUARDAR')
            self.button2.Enable(True)

    def guardaencomprasoperaciones(self,idfactura):
        #AGREGADO El 5 de ENERO 2010, sensacion termica de 44 grados!! papito !
        #fecha = self.padre.fecha
        idproveedor = self.inproveedor.GetValue()
        nrofactura = self.nro_factura.GetValue()
        cantprendas = self._cantidad_de_prendas()
        total = self.totaltotal.Value
        if self.radioButton1.GetValue():
            en1oen2 = 1
        else:
            en1oen2 = 2
        total1 = 0
        total2 = 0
        
        if self.radioButton1.GetValue():
            total1 = total
            total2 = 0.00
            en1oen2 = 1
        else:
            total1 = 0.00
            total2 = total
            en1oen2 = 2
           
        subtotal = self.insubtotal.Value
        iva = self.iniva.Value
        
        fecha = utiles.obtenerFecha("Y-m-d h:m:s")
        #saca el nro de registro
        sql2 = "SELECT idregistro FROM proveedor WHERE idproveedor='%s'" % str(idproveedor)
        resultado = consultasBD.ordenCrudaResultDict(sql2)
        self.registro = int(resultado["idregistro"])+1
        #sql = "INSERT INTO comprasaldos (idoperacion,fecha,idproveedor,monto1,monto2,nrofactura,cantproductos,idforma1o2,observaciones,operador,temporada,idregistro) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s','%s','%s') " % (str("COMPRA") ,fecha,idproveedor,total1,total2,nrofactura,cantprendas,en1oen2,"","",str("INVIERNO2011"),self.registro)
        
        r1 = "INSERT INTO comprasaldos ("
        r2 = "idoperacion,fecha,idproveedor,"
        r3 = "monto1,monto2,nrofactura, "
        r4 = "cantproductos,idforma1o2,observaciones,"
        r5 = "operador,temporada,idregistro) "
        r6 = "VALUES ("
        r7 = "'%s', '%s', '%s'," % (str("COMPRA") ,fecha,idproveedor)
        r8 = "'%s', '%s', '%s'," % (total1,total2,nrofactura)
        r9 = "'%s', '%s', '%s'," % (cantprendas,en1oen2,"")
        r0 = "'%s', '%s', '%s')" % ("",self.comboBox1.GetLabel(),self.registro)
        sql = r1+r2+r3+r4+r5+r6+r7+r8+r9+r0
        consultasBD.executaSinCommit(None, sql)
        
        sqlupdate = "UPDATE proveedor SET idregistro=idregistro+1 WHERE idproveedor='%s'" % (idproveedor)
        resultado = consultasBD.executaSinCommit(None,sqlupdate)
                
    def _crear_stock_si_no_esta(self, ptc, sucursal):
        '''Retorna el stock que tenga los atrib de parametro, si no esta lo crea'''
        sql = "SELECT * FROM stock WHERE ptc = '%s' AND sucursal = '%s'" % (ptc, self.sucursal)
        resultado = consultasBD.ordenCrudaResultDictSinCommit(sql)
        sql_stock = ""
        if len(resultado) == 0:
            sql_stock = "INSERT INTO stock (ptc, sucursal, stock) VALUES ('%s', '%s', '%s')" %\
            (ptc, sucursal, "0")                
            sincronizar_tabla.addChange(sql=sql_stock)
            consultasBD.executaSinCommit(None, sql_stock)

    def _buscar_producto_talle_color(self, codsussan, talle, color):
        '''Retorna el ptc que tenga los atrib de parametro, si no esta lo crea'''
        sucursal = self.sucursal
        #sql = "SELECT * FROM producto_talle_color WHERE codsussan = '%s' AND talle = '%s' AND color = '%s'" % (codsussan, talle, color)
        r1 = "SELECT * FROM producto_talle_color "
        r2 = "WHERE codsussan='%s' AND talle='%s' AND color='%s'" % (codsussan, talle, color)
        sql = r1+r2
        resultados = consultasBD.ordenCrudaResultDictSinCommit(sql)
        if len(resultados) == 0:
            ptc = utiles.secuencia("producto_talle_color", self.sucursal)
            #sql = "INSERT INTO producto_talle_color (id, codsussan, talle, color) VALUES ('%s', '%s', '%s', '%s')" % (ptc, codsussan, talle, color)
            r1 = "INSERT INTO producto_talle_color ("
            r2 = "id, codsussan, talle, color) "
            r3 = "VALUES ("
            r4 = "'%s', '%s', '%s', '%s')" % (ptc, codsussan, talle, color)
            sql = r1+r2+r3+r4
            sincronizar_tabla.addChange(sql=sql)
            consultasBD.executaSinCommit(None, sql)
            return ptc

        #return resultados[0]['id']       
        return resultados['id']

    def imprimirLaser(self):

        def generarImpresion(archivo,datos):
            archivo_salida = open(archivo, 'w')
            archivo_salida.write(datos)
            archivo_salida.close()
            ruta = "type "+archivo+" > prn"
            os.system(ruta)
            archivo_salida = open(archivo, 'w')
            archivo_salida.write("")
            archivo_salida.close()
            return

        #cant. de etiquetas que tiene una compra
        totalesEtiqueta=0
        #cantidad de etiquetas que tiene un producto, en una fila
        cantidad=0
        #resto Etiquetas que quedan para imprimir
        resto=0
        #cambio Si va a la izq o a la derecha de las impresorasesa 
        cambio=1
        #cerrojo para el if y for
        pasa=0
        totalesEtiqueta = int( self.incantidades.GetValue())
        for i in xrange(self.grid1.GetNumberRows()):
			if (self.grid1.GetCellValue(int(i),0) != ""):
				totalesEtiqueta = totalesEtiqueta + int((self.grid1.GetCellValue(i,3))) 

		#recorre todas la grilla y saca todos los codsussan distintos con sus cant. 
		#para enviar a hacer etiquetas
        for z in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(int(z),0) != ""):
                print "Generando..."+ str(self.grid1.GetCellValue(int(z),0))
                #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
                #0            1          2      3    4     5     6       7   8     9          
                cantidad  = int(self.grid1.GetCellValue(int(z),3))
                codsussan = self.grid1.GetCellValue(int(z),1)
                descri    = str(self.grid1.GetCellValue(z,2))
                talle     = self.grid1.GetCellValue(int(z),4).upper()
                color     = self.grid1.GetCellValue(int(z),5)
                proveedor = self.inproveedor.Value
                precioVenta = self.grid1.GetCellValue(int(z),9)

##				#join con precios
##                SQL = "SELECT preciolt1 FROM productos WHERE codsussan = '%s'" % (codsussan)
##                resultados = consultasBD.ordenCrudaResultDict(SQL)
##                precioVenta = resultados["preciolt1"]
                
                id_producto_talle_color = self._buscar_producto_talle_color(codsussan, talle, color)
                
                SQLc="SELECT nombre FROM COLORES WHERE idcolor='%s'" % (color)
                resultado = consultasBD.ordenCrudaResultDict(SQLc)
                nombreColor = resultado["nombre"]         

                for x in xrange(cantidad):
                    print "Linea",z,"Etiquetas",x
                    if (cambio==1): 
                        txt_file = open("sus3.txt", 'r')
                        self.txt = txt_file.read()
                        txt_file.close()
                        self.txt = self.txt.replace("$descrip1",descri[:20])
                        self.txt = self.txt.replace("$talle1",talle)
                        self.txt = self.txt.replace("$color1",color)
                        self.txt = self.txt.replace("$codsus1",codsussan)
                        self.txt = self.txt.replace("$ptc1",id_producto_talle_color)
                        self.txt = self.txt.replace("$proveedor1",proveedor)
                        self.txt = self.txt.replace("$precio1","$" + str(precioVenta))
                        self.txt = self.txt.replace("$descrico1",str(nombreColor[:20]))
                        cambio=2
                        totalesEtiqueta=totalesEtiqueta-1
                        if totalesEtiqueta==0:
                            generarImpresion('etiqueta1_reemplazada.txt',self.txt)
                    else:
                        self.txt = self.txt.replace("$descrip2",descri[:20])
                        self.txt = self.txt.replace("$talle2",talle)
                        self.txt = self.txt.replace("$color2",color)
                        self.txt = self.txt.replace("$codsus2",codsussan)
                        self.txt = self.txt.replace("$ptc2",id_producto_talle_color)
                        self.txt = self.txt.replace("$proveedor2",proveedor)
                        self.txt = self.txt.replace("$precio2","$" + str(precioVenta))
                        self.txt = self.txt.replace("$descrico2",str(nombreColor[:20]))
                        cambio=1
                        totalesEtiqueta=totalesEtiqueta-1
                        if totalesEtiqueta==0 :
                            generarImpresion('etiqueta1_reemplazada.txt',self.txt)
                            print "Salio x break"
                            break # sale porque termina, por ejemplo , cuando son 2 o 4 etiquetas
                        #sigue imprimiendo porque faltan mas etiquetas del mismo codsussan
                        generarImpresion('etiqueta1_reemplazada.txt',self.txt)
                        print "Final etiqueta 2"
        generarImpresion('etiqueta1_reemplazada.txt',self.txt)
        #fin impresion con laser
		
    def OnImprimirButton(self, event):
        self.imprimirLaser()
        if not self._validar_imprimir():
            return
        return

##        #El siguiente codigo es para impresora en barra cuando esta tambien andando la laser
##        #mientras tanto, no se necesita y se comenta.
##        from barras import imprimir_etiquetas as ie
##        proveedor = self.inproveedor.Value
##        parametro_impresion = []
##        for x in xrange(60):
##            if (self.grid1.GetCellValue(int(x),0) != ""):
##                codsussan = self.grid1.GetCellValue(int(x),1)
##                descri = str(self.grid1.GetCellValue(int(x),2))
##                cantidad = int(self.grid1.GetCellValue(int(x),3))
##                talle = self.grid1.GetCellValue(int(x),4).upper()
##                color = self.grid1.GetCellValue(int(x),5)
##                costounidad = float(self.grid1.GetCellValue(int(x),6))
##                #join con precios
##                SQL = "SELECT preciolt1 FROM productos WHERE codsussan = '%s'" % (codsussan)
##                print SQL
##                resultados = consultasBD.ordenCrudaResultDict(SQL)
##                precioVenta = resultados["preciolt1"]
##                id_producto_talle_color = self._buscar_producto_talle_color(codsussan, talle, color)
##                for y in range(cantidad):
##                    parametro_impresion.append((id_producto_talle_color, codsussan, descri, precioVenta, talle, color))
##        print "parametro_impresion", parametro_impresion
##        temp = ie(parametro_impresion, proveedor=proveedor)
##        temp.imprimir()        

    def OnBuscarProveedorButton(self, event):
        if self.inproveedor.GetValue() != "":
            consultaSQL = "SELECT idproveedor,nombre FROM proveedor WHERE idproveedor = '"+self.inproveedor.GetValue()+"' "
            resultado = consultasBD.ordenCrudaDict(consultaSQL)
            if resultado != ():
                proveedor = resultado[0]
                self.inproveedor.SetLabel(proveedor["idproveedor"])
                self.inNombreProvee.SetLabel(proveedor["nombre"])
                self.nro_factura.SetFocus()
                return
            self.inproveedor.SetLabel("")
            self.inproveedor.SetFocus()
            return
        import BuscaProveedor2
        ventana = BuscaProveedor2.Dialog1(self,self.inNombreProvee.GetLabel())
        try:
            ventana.ShowModal()
            eleccion = ventana.getSeleccion()
        finally:
            ventana.Destroy()
        if eleccion.split(" / ") != ['']:
            self.inproveedor.SetValue(eleccion.split(" / ")[1])
            self.inNombreProvee.SetValue(eleccion.split(" / ")[0])
        self.nro_factura.SetFocus()

    def OnInproveedorSetFocus(self, event):
        if not utiles.isGrillaEmpy(self.grid1, 60):
            self.grid1.SetFocus()
            utiles.mensaje(self, "No puede cambiar el proveedor si ya introdujo algun item")
            return        
    
    def OnDescuentoEnter(self, event):
        event.Skip()

    def OnDescuentoPerderFoco(self, event):
        subtotal = Decimal(self.intotal.GetLabel()).quantize(Decimal("0.10"))
        try:
            descuento = Decimal(self.indesc.GetLabel()).quantize(Decimal("0.10"))
        except:
            descuento = Decimal("0.00")
        subdescuento = (subtotal*descuento/Decimal("100.00")).quantize(Decimal("0.10"))
        total = subtotal - subdescuento
        self.indesc.SetLabel(str(descuento))
        self.totaltotal.SetLabel(str(total))

    def OnRadioBox1Radiobox(self, event):
        suma=0.0
        if self.radioBox1.Selection==0:
            suma = float(self.intotal.Value)+float(self.iniva.Value)
            print suma
            self.totaltotal.ChangeValue(str(suma))
        else:
            self.totaltotal.ChangeValue(self.intotal.Value)
        self.OnDescuentoPerderFoco(None)

    def almacenamientoTemporal(self,fila,borrar=False):
        f=open("Compras.txt","a")
        nroproveedor = self.inproveedor.GetLabel()
        proveedor = self.inNombreProvee.GetLabel()
        nrofactura = self.nro_factura.GetLabel()
        totalfactura = self.textCtrl2.GetLabel()
        fechafactura = self.infechafactura.GetLabel()
        fechaingreso = self.textCtrl1.GetLabel()
        temporada = self.comboBox1.GetLabel()
        cantidades = self.incantidades.GetLabel()
        siniva = self.insubtotal.GetLabel()
        iva = self.iniva.GetLabel()
        subtotal = self.intotal.GetLabel()
        descuento = self.indesc.GetLabel()
        total = self.totaltotal.GetLabel()
        encabezado = nroproveedor+"[;]"+proveedor+"[;]"+nrofactura+"[;]"
        encabezado+= totalfactura+"[;]"+fechafactura+"[;]"+fechaingreso+"[;]"
        encabezado+= temporada+"[;]"+cantidades+"[;]"+siniva+"[;]"+iva+"[;]"
        encabezado+= subtotal+"[;]"+descuento+"[;]"+total+"[;]"
        if not borrar:
            cadena = str(fila)+"[;]"+encabezado
            for item in xrange(self.grid1.GetNumberCols()):
                cadena+= str(self.grid1.GetCellValue(fila,item))+"[;]"
        else:
            cadena = "-1[;]"+str(fila)+"[;]"+encabezado
        cadena = cadena[:-3]+"\n"
        f.write(cadena)
        f.close()

    def verificarInterrupcion(self):
        if not os.path.isfile("Compras.txt"):
            f=open("Compras.txt","w")
            f.close()
            print "Almacenamiento de Compras iniciado"
            return
        #existe archivo, por lo tanto un corte interrumpio la carga y se debe recuperar la informacion
        f=open("Compras.txt","r")
        lista = f.readlines()
        f.close()
        if len(lista)==0:
            f=open("Compras.txt","w")
            f.close()
            print "Almacenamiento de Compras iniciado"
            return
        self.habilitaEncabezado(False)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,None)
        print "Restaurando ultima Compra"
        for item in lista:
            cadena = item.split("[;]")
            if cadena[0]=="-1":
                self.grid1.DeleteRows(int(cadena[1]))
                continue
            try:
                fil = int(cadena[0])
            except:
                continue
            self.inproveedor.SetLabel(cadena[1])
            self.inNombreProvee.SetLabel(cadena[2])
            self.nro_factura.SetLabel(cadena[3])
            self.textCtrl2.SetLabel(cadena[4])
            self.infechafactura.SetLabel(cadena[5])
            self.textCtrl1.SetLabel(cadena[6])
            self.comboBox1.SetLabel(cadena[7])
            self.incantidades.SetLabel(cadena[8])
            self.insubtotal.SetLabel(cadena[9])
            self.iniva.SetLabel(cadena[10])
            self.intotal.SetLabel(cadena[11])
            self.indesc.SetLabel(cadena[12])
            self.totaltotal.SetLabel(cadena[13])

            #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
            #14           15         16     17   18    19    20      21  22    23
            #0            1          2      3    4     5     6       7   8     9
            self.grid1.SetCellValue(fil,0,cadena[14])
            self.grid1.SetCellValue(fil,1,cadena[15])
            self.grid1.SetReadOnly(fil, 1, True)
            self.grid1.SetCellValue(fil,2,cadena[16])
            self.grid1.SetReadOnly(fil, 2, True)
            self.grid1.SetCellValue(fil,3,cadena[17])
            self.grid1.SetCellAlignment(fil, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellValue(fil,4,cadena[18])
            self.grid1.SetCellValue(fil,5,cadena[19])
            self.grid1.SetCellValue(fil,6,cadena[20])
##            if not "*" in self.grid1.GetCellValue(fil,0):
##                self.grid1.SetReadOnly(fil, 6, True)
            self.grid1.SetCellAlignment(fil, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellValue(fil,7,cadena[21])
            self.grid1.SetReadOnly(fil, 7, True)
            self.grid1.SetCellAlignment(fil, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellValue(fil,8,cadena[22])
            self.grid1.SetReadOnly(fil, 8, True)
            self.grid1.SetCellAlignment(fil, 8, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellValue(fil,9,cadena[23])
            self.grid1.SetReadOnly(fil, 9, True)
            self.grid1.SetCellAlignment(fil, 9, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            if fil<(self.grid1.GetNumberRows()-1):
                continue
            self.grid1.AppendRows()

        self.autosizegrilla()
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,self.OnGrid1GridCellChange)

    def OnRadio1(self, event):
        self.recalculaIVA()

    def OnRadio2(self, event):
        self.recalculaIVA()
        
    def recalculaIVA(self):
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)=="":
                continue
            #Cod Art Prov,Cod Sussan,Descri,Cant,Talle,Color,$ Costo,Iva,Total,Precio Venta
            #14           15         16     17   18    19    20      21  22    23
            #0            1          2      3    4     5     6       7   8     9
            porIVA = Decimal("0.21")
            try:
                cantidad = Decimal(self.grid1.GetCellValue(fil,3)).quantize(Decimal("0.10"))
            except:
                cantidad = Decimal("0.00")
            try:
                costo = Decimal(self.grid1.GetCellValue(fil,6)).quantize(Decimal("0.10"))
            except:
                costo = Decimal("0.00")
            iva = Decimal("0.00")
            if self.radioButton1.GetValue():
                iva = (costo*porIVA).quantize(Decimal("0.10"))
            total = ((costo+iva)*cantidad).quantize(Decimal("0.10"))
            self.grid1.SetCellValue(fil,7,str(iva))
            self.grid1.SetCellValue(fil,8,str(total))
            self.almacenamientoTemporal(fil)
        self.actualizaSubtotal()
    
